#include "pipeline.h"

#include <string_view>
#include <vector>

namespace cfg
{

// 作用：required_key validator，校验指定路径必须存在。
// 参数：
//  - view: 冻结后的只读视图
//  - options: 必须包含 "path"，支持 JSON Pointer (/a/b) 或 a.b[0] 语法
//  - out_errors: 追加诊断信息
class ValidatorRequiredKey : public IValidator
{
public:
    void validate(const View & view,
                  const PluginOptions & options,
                  std::vector<ConfigError> & out_errors) override
    {
        auto it = options.find("path");
        if (it == options.end())
            return;
        const std::string & p = it->second;

        auto try_view = [&]() -> expected<View, ConfigError>
        {
            if (!p.empty() && p[0] == '/')
                return view.lookup(p);
            else
                return view.lookup(p); // 两种语法已在 lookup 中兼容
        }();

        if (!try_view)
        {
            ConfigError e = try_view.error();
            e.notes = "required key missing";

            // 若为 JSON Pointer 风格，则始终提供基于指针的 token 化路径，避免底层错误仅给出单 token
            if (!p.empty() && p[0] == '/')
            {
                std::vector<std::string> path_tokens;
                std::string_view sv = std::string_view(p).substr(1);
                size_t start = 0;
                while (start <= sv.size())
                {
                    size_t pos = sv.find('/', start);
                    std::string_view part = (pos == std::string_view::npos)
                                                ? sv.substr(start)
                                                : sv.substr(start, pos - start);
                    if (!part.empty())
                        path_tokens.emplace_back(part);
                    if (pos == std::string_view::npos)
                        break;
                    start = pos + 1;
                }
                e.path = std::move(path_tokens);
            }

            out_errors.emplace_back(std::move(e));
        }
    }
};

// 静态注册内置 validator
REGISTER_VALIDATOR("required_key", ValidatorRequiredKey);

} // namespace cfg
